﻿using System;
using System.Collections.Generic;
using System.Web.UI;
using System.Web.UI.DataVisualization.Charting;
using System.Web.UI.WebControls;
using vudu.Logica.Clases;

namespace vudu.PaginasWeb.G9Reporte
{
    public partial class ReportePromedio : System.Web.UI.Page
    {
        public static string seccionSeleccionada;
        Logica.Clases.Reporte reporte = new Logica.Clases.Reporte();
        public static List<Evaluacion> evaluaciones = new List<Evaluacion>();
        public static List<Estudiante> estudiantes = new List<Estudiante>();
        public static List<int> cedulas = new List<int>();

        /// <summary>
        /// Se carga la pagina
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            //se valida que sea un profesor sino se va a inicio sistema
            string miRol = (string)Session["rol"];

            if (miRol != "Profesor")
                Response.Redirect("../G3AccesoSistema/InicioSistema.aspx");


            if (!Page.IsPostBack)
            {
                //se cargan los datos del profesor
                Profesor miProfe = new Profesor();
                miProfe = (Profesor)Session["Usuario"];
                Label1.Text = "Profesor(a): " + miProfe.Nombre + " " + miProfe.Apellido;
                Label2.Text = ReporteSeleccion.nombreMateria;
                seccionSeleccionada = ReporteSeleccion.seccionSeleccionada;
                //se consultan las notas y los estudiantes en la seccion
                evaluaciones = reporte.ConsultarNotas(int.Parse(seccionSeleccionada));
                estudiantes = reporte.ConsultarEstudiantes(int.Parse(seccionSeleccionada));
                cedulas = ConsultaEstudiantes(estudiantes);
                Promedios(evaluaciones,cedulas);

                if (estudiantes.Count.Equals(0))
                {
                    Label5.Text = "No hay alumnos inscritos";
                    Label5.ForeColor = System.Drawing.Color.Red;
                    Table2.Visible = false;
                    Chart1.Visible = false;
                    tabla.Visible = false;
                }
                if (evaluaciones.Count.Equals(0))
                {
                    Label6.Text = "No hay evaluaciones asignadas";
                    Label6.ForeColor = System.Drawing.Color.Red;
                    Table2.Visible = false;
                    Chart1.Visible = false;
                    tabla.Visible = false;
                }
            }
        }

        /// <summary>
        /// Se crea una lista con los id de los estudiantes de la seccion
        /// </summary>
        /// <returns>
        /// retona una lista de ids
        /// </returns>
        public List<int> ConsultaEstudiantes(List<Estudiante> estudiante)
        {
            int i = 0;
            List<int> cedulas = new List<int>();

            //se recorre la lista de estudiantes y se agrega a una lista los id de los estudiantes
            while (i < estudiante.Count)
            {
                cedulas.Add(estudiante[i].IdEst);
                i++;
            }
            return cedulas;
        }

        /// <summary>
        /// Se calculan los promedios por cada evaluacion de la seccion
        /// </summary>
        public void Promedios(List<Evaluacion> evaluaciones,List<int> numEstudiantes)
        {
            int i = 0;
            int numEvaluaciones = evaluaciones.Count;
            List<int> calculo = new List<int>();
            string[] numeroEvaluaciones = new string[numEvaluaciones];
            List<String> notaspromedios = new List<String>();
            List<String> nombreevaluaciones = new List<String>();
            List<decimal> promedioCalcular = new List<decimal>();
            decimal promedio = 0;

            //se recorre cada evaluacion para calcular las notas
            while (i < numEvaluaciones)
            {
                int j = 0;
                List<decimal> promedioPorEvaluacion = new List<decimal>();

                //se recorre cada nota para almacenarla en la lista de notas
                while (j < evaluaciones[i].NotasEvaluacion.Count)
                {
                    int k = 0;
                    //se recorre cada estudiante para validar que este en la seccion
                    while (k < numEstudiantes.Count)
                    {
                        if (numEstudiantes[k] == evaluaciones[i].NotasEvaluacion[j].FkIdEstudiante)
                        {
                            promedioPorEvaluacion.Add(evaluaciones[i].NotasEvaluacion[j].NotaObtenida);
                        }
                        k++;
                    }
                    j++;
                }
                //se calculan los promedios por cada evaluacion
                int conversion = Convert.ToInt32(reporte.CalcularPromedio(promedioPorEvaluacion));
                numeroEvaluaciones[i] = evaluaciones[i].Nombre;
                notaspromedios.Add(Convert.ToString(conversion));
                nombreevaluaciones.Add(evaluaciones[i].Nombre);
                promedioCalcular.Add(conversion);
                calculo.Add(conversion);
                i++;
            }
            promedio = reporte.CalcularDefinitivaAlumnos(evaluaciones, promedioCalcular);
            Graficar(numeroEvaluaciones, calculo);
            notaspromedios.Add(Convert.ToString(promedio));
            nombreevaluaciones.Add("Total");
            LlenarTabla(notaspromedios,nombreevaluaciones, numEstudiantes.Count);

        }

        /// <summary>
        /// Se dibuja el grafico con los datos dados
        /// </summary>
        public void Graficar(string[] numeroEvaluaciones, List<int> calculo)
        {
            Title title = new Title("Promedios");
            title.Font = new System.Drawing.Font("Arial", 20);
            Chart1.Titles.Add(title);
            Chart1.Series.Add(new Series());
            Chart1.Series[0].Points.DataBindXY(numeroEvaluaciones, calculo );
            Chart1.ImageType = System.Web.UI.DataVisualization.Charting.ChartImageType.Jpeg;
            Chart1.Legends.Add(new Legend());
            Chart1.Legends[0].Enabled = false;
            Chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
            Chart1.ChartAreas[0].AxisY.MajorGrid.Enabled = false;
        }

        /// <summary>
        /// Se llena la tabla con los datos buscados
        /// </summary>
        public void LlenarTabla(List<String> notasPromedio , List<String> nombreEvaluaciones, int numEstudiantes)
        {
            //se crea un nuevo registro para la tabla
            TableRow registroTabla = new TableRow();
            Table2.Rows.Add(registroTabla);

            //se crea una celda para esta tabla
            TableCell celdaTabla = new TableCell();
            celdaTabla.Width = 100;
            registroTabla.Cells.Add(celdaTabla);

            //se crean las celdas con los encabezados
            System.Web.UI.WebControls.Label labelCabecera = new Label();
            labelCabecera.Text = "Evaluación";
            celdaTabla.Font.Bold = true;
            celdaTabla.Controls.Add(labelCabecera);

            celdaTabla = new TableCell();
            celdaTabla.Width = 100;
            celdaTabla.Font.Bold = true;
            registroTabla.Cells.Add(celdaTabla);
            labelCabecera = new Label();
            labelCabecera.Text = "Promedio";
            celdaTabla.Controls.Add(labelCabecera);

            int i = 0;

            //se introducen los datos de cada evaluacion con el promedio calculado
            while (i < notasPromedio.Count)
            {
                TableRow registroTabla2 = new TableRow();
                Table2.Rows.Add(registroTabla2);

                TableCell celdaTabla2 = new TableCell();
                registroTabla2.Cells.Add(celdaTabla2);
                System.Web.UI.WebControls.Label labelRegistro = new Label();
                labelRegistro.Text = nombreEvaluaciones[i];
                celdaTabla2.Controls.Add(labelRegistro);

                TableCell celdaTabla3 = new TableCell();
                registroTabla2.Cells.Add(celdaTabla3);
                System.Web.UI.WebControls.Label labelRegistro3 = new Label();
                labelRegistro3.Text = notasPromedio[i];
                celdaTabla3.Controls.Add(labelRegistro3);
                i++;
            }

            //se agrega a la tabla el numero de estudiantes
            TableRow registroTabla3 = new TableRow();
            Table2.Rows.Add(registroTabla3);

            TableCell celdaTabla4 = new TableCell();
            registroTabla3.Cells.Add(celdaTabla4);
            System.Web.UI.WebControls.Label labelRegistro4 = new Label();
            labelRegistro4.Text = "N° Estudiantes";
            celdaTabla4.Controls.Add(labelRegistro4);

            TableCell celdaTabla5 = new TableCell();
            registroTabla3.Cells.Add(celdaTabla5);
            System.Web.UI.WebControls.Label labelRegistro5 = new Label();
            labelRegistro5.Text = Convert.ToString(numEstudiantes);
            celdaTabla5.Controls.Add(labelRegistro5);
        }

        /// <summary>
        /// Se imprime la informacion de la pagina
        /// </summary>
        protected void Button1_Click(object sender, EventArgs e)
        {
            Session["ctrl"] = Panel1;
            Promedios(evaluaciones,cedulas);
            ClientScript.RegisterStartupScript(this.GetType(), "onclick", "<script language=javascript>window.open('ImprimirReporte.aspx','PrintMe','height=500px,width=500px,scrollbars=1');</script>");
        }

        /// <summary>
        /// Se devuelve a la pagina de seleccion de reporte
        /// </summary>
        protected void Button3_Click(object sender, EventArgs e)
        {
            Response.Redirect("ReporteSeleccion.aspx");

        }
    }
    
}